package com.zhouhailin.reflection;

import java.lang.reflect.Field;

/**
 * 通过反射访问类中的成员
 *
 * @Author：zhouhailin
 * @Date： 2023/2/13
 */
public class ReflectionAccessProperty {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {

        // 1、得到 Student 类对应的 Class 对象
        Class<?> stuClass = Class.forName("com.zhouhailin.reflection.Student");
        // 2、创建对象
        Object o = stuClass.newInstance();
        System.out.println(o.getClass());

        // 3、使用反射获取 age 属性对象
        Field age = stuClass.getField("age");
        // 3.1）通过反射来操作属性
        age.set(o, 100);
        System.out.println(o);
        // 返回 age 属性的值
        System.out.println(age.get(o));

        // 4、使用反射操作 name 属性
        Field name = stuClass.getDeclaredField("name");
        // 对 name 进行暴破, 可以操作 private 属性
        name.setAccessible(true);
        name.set(o, "周海林");
        // 因为 name 是 static 属性，因此 o 也可以是 null
//        name.set(null, "周海林--");

        System.out.println(o);
        // 获取属性值
        System.out.println(name.get(o));
        // 获取属性值，要求 name 是 static
        System.out.println(name.get(null));

    }
}

class Student {
    public int age;
    private static String name;

    /**
     * 构造器
     */
    public Student() {
    }

    @Override
    public String toString() {
        return "Student [age=" + age + ", name=" + name + "]";
    }
}
